package liecai_class.day04;

/**
 * Map - 映射集 - HashMap
 * Map是一种键值对的集合，每个元素都包含一个键对象和一个值对象
 * Map键对象是唯一的，值对象可以重复
 * Map集合中的元素是无序的，不能通过下标获取元素
 *
 * HashMap原理 - hash分桶
 * HashMap底层是一个哈希表，哈希表是一个数组，数组中的每个元素是一个单向链表
 * 哈希表的每个元素都是一个单向链表，链表中的每个节点都是一个键值对对象
 *
 * HashMap的容量、装载因子、扩容机制
 * 容量:hashMap中桶的数量，默认值16，可以在创建HashMap时手动指定
 * 装载因子:hashMap中最大的数据保存量占总容量的比例，默认值0.75，可以在创建链表时手动指定，一旦保存的数据量超过了容量*装载因子，HashMap会自动触发扩容机制
 * 扩容机制:当HashMap中的数据量超过了容量*装载因子，会自动扩容为原来的2倍，再将原来的数据重新保存到新的桶中保存，保证了空间的充足，避免桶中链表过长，提高了查询效率
 *
 * 所以，HashMap中桶中形成链表的概率是比较低的，形成超长链表的概率更低，保证了效率，基本接近于O(1)
 *
 * HashMap在创建时，容量和装载因子配置多少合适呢？
 * 容量过大，会浪费空间，容量过小，会导致扩容次数过多，影响效率
 * 装载因子过大，会导致桶中链表过长，影响效率，装载因子过小，浪费存储空间，同时会导致扩容次数过多，影响效率
 * 所以，没有固定的最佳配置，需要根据实际情况进行配置
 * 通常基于需要保存的数量来进行预估
 */
public class Demo02 {
    public static void main(String[] args) {
        MyHashMap map = new MyHashMap();
        for(int i = 1;i<=24;i++){
            map.put("k"+i,"v"+i);
        }
        System.out.println(map);

    }
}
